package com.example.customGeneric;

/**
 * 自定义泛型接口
 */
public class CustomInterfaceGeneric {
    public static void main(String[] args) {

    }
}

interface IUsb<U, R> {

    int n = 10;
    //U name = "hsp";//错误接口中的成员都是静态的, 而静态成员不能使用泛型 cannot be referenced from a static context

    //普通方法中, 可以使用接口泛型
    R get(U u);

    void hi(R r);

    void run(R r1, R r2, U u1, U u2);

    default R method(U u){
        return null;
    }
}

//实现接口时, 直接指定泛型接口的类型
//会直接指定为给定的类型
class BB implements IUsb<Integer, Float>{

    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {

    }

    @Override
    public void run(Float r1, Float r2, Integer u1, Integer u2) {

    }
}

//类实现接口的时候没有指定类型, 默认为Object
//建议直接携程IUsb<Object, Object>
class CC implements IUsb {//等价 class CC implements IUsb<Object, Object>

    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {

    }

    @Override
    public void run(Object r1, Object r2, Object u1, Object u2) {

    }
}

//在继承接口中指定泛型接口的类型
interface IA extends IUsb<String, Double>{

}


//当我们去实现IA接口时, 因为IA在继承IUsb时, 指定了U为String, R为Double
//在实现IUsb接口的方法时, 使用String替换U, 是Double替换R
class AA implements IA {

    @Override
    public Double get(String s) {
        return null;
    }

    @Override
    public void hi(Double aDouble) {

    }

    @Override
    public void run(Double r1, Double r2, String u1, String u2) {

    }
}